package jp.ac.u_tokyo.dch.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @version 1.1
*/
public class PasswordUtil {


	/** ロガー */
	private static DchLogger logger = DchLogger.getLogger(PasswordUtil.class);
	/**
	 *  ハッシュアルゴリズム定数 (SHA-1)
	 */
	private static String SHA1 = "SHA1";

	/**
	 * ハッシュアルゴリズム定数 (MD-5)
	 */
	private static String MD5 = "MD5";


	/**
	 * パスワード暗号化(複合化はできない）
	 *
	 * @param password 暗号化したいパスワード
	 * @return         暗号化後のパスワード
	 * @throws NoSuchAlgorithmException
	 */
	public static String getHashPassword(String password)  {

		String hashpassword = null;

		if ( password == null ) return null;

		try {
			hashpassword = getHashSha1(password);
		} catch (NoSuchAlgorithmException e) {
			logger.error(e);
		}

		return hashpassword;
	}

	/**
	 * パスワードの一致検査
	 *
	 * @param password         テキストパスワードデータ
	 * @param hashPassword     照合したいハッシュパスワードデータ
	 * @return                 true 照合 / false 非照合
	 * @throws NoSuchAlgorithmException
	 */
	public static boolean doMatchPassword(String password, String hashPassword) throws NoSuchAlgorithmException {
		if ( password == null || hashPassword == null ) {
			return false;
		}
		return getHashSha1(password).equals(hashPassword);
	}

	/**
	 *
	 * ハッシュ値をダイジェストで取得する
	 *
	 * @param str       対象文字列
	 * @param algorithm ハッシュアルゴリズム
	 * @return          ハッシュ後のバイト
	 * @throws NoSuchAlgorithmException
	 */
	private static byte[] getDigest(String str, String algorithm) throws NoSuchAlgorithmException {

		// 指定されたアルゴリズムでMessageDigestインスタンスを作成
		MessageDigest md = MessageDigest.getInstance(algorithm);

		// 文字列をバイトで取得
		byte[] byteData = str.getBytes();

		// ダイジェスト計算
		md.update(byteData);

		// ダイジェスト値返還
		return md.digest();
	}

	/**
	 * ダイジェスト値を文字列に変換する(16進数)
	 *
	 * @param digest   ダイジェストバイト
	 * @return         変換後文字列
	 */
	private static String toString4Digest(byte[] digest) {

		StringBuffer buf = new StringBuffer();
		for (int i = 0; i < digest.length; i++) {
			int d = digest[i];
			if (d < 0) {
				d += 256;
			}
			if (d < 16) {
				buf.append("0");
			}
			buf.append(Integer.toString(d,16));
		}
		return buf.toString();
	}

	/**
	 *
	 * ハッシュ(Sha-1)文字列を取得する
	 *
	 * @param str ハッシュしたい文字列
	 * @return    ハッシュ後の文字列
	 * @throws NoSuchAlgorithmException
	 */
	private static String getHashSha1(String str) throws NoSuchAlgorithmException {

		return toString4Digest(getDigest(str, SHA1));

	}

}
